package com.klun.designMode.composite.modeOne;

import java.util.ArrayList;

/**
 * Composite（容器构件）：它在组合结构中表示容器节点对象，容器节点包含子节点，
 * 其子节点可以是叶子节点，也可以是容器节点，它提供一个集合用于存储子节点，
 * 实现了在抽象构件中定义的行为，包括那些访问及管理子构件的方法，在其业务方法中可以递归调用其子节点的业务方法
 */
public class Composite extends Component {
    private ArrayList<Component> list = new ArrayList<Component>();

    public Composite(String name) {
        super(name);
    }

    public void add(Component c) {
        list.add(c);
    }

    public void remove(Component c) {
        list.remove(c);
    }

    public Component getChild(int i) {
        return (Component)list.get(i);
    }

    /**
     * 在组合模式结构中，由于容器构件中仍然可以包含容器构件，
     * 因此在对容器构件进行处理时需要使用递归算法，
     * 即在容器构件的operation()方法中递归调用其成员构件的operation()方法。
     */
    public void operation() {
        //容器构件具体业务方法的实现
        //递归调用成员构件的业务方法
        for(Object obj:list) {
            ((Component)obj).operation();
        }
    }
}
